﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Drawing;
using BusinessLogic;
using DTO;
using System.Data;

namespace Presentation.Content
{
    public partial class panelUsuario : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                //Se carga el ddldoctype con los tipos de documento disponibles.
                loadDdlDocType();
                //Se hacen invisibles los multiview.
                mvDdlMain.ActiveViewIndex = -1;
                mvMain.ActiveViewIndex = -1;
                mvUserType.ActiveViewIndex = -1;
                mvUserPass.ActiveViewIndex = -1;
                mvSearch.ActiveViewIndex = -1;
                
                //Si el usuario logueado es un administrador, se habilita el DropDownList main.
                if (Session["userRole"].Equals("Administrator"))
                {
                    mvDdlMain.ActiveViewIndex = 0;

                }
                else if (Session["userRole"].Equals("Teacher"))
                {
                    mvDdlMain.ActiveViewIndex = -1;
                    mvUserPass.ActiveViewIndex = -1;
                    mvUserType.ActiveViewIndex = -1;
                    mvButtons.ActiveViewIndex = -1;
                    mvMain.ActiveViewIndex = 0;
                    mvSearch.ActiveViewIndex = 0;
                    //Carga el dropdownlist de busqueda de usuarios y alumnos con los tipos de usuarios disponibles para dicha busqueda.
                    loadDdlSearch(Session["userRole"].ToString());
                }
            }
        }
        //Carga el dropdownlist de busqueda con los roles disponibles dependiendo del tipo de usuario logueado.
        private void loadDdlSearch(string vRole)
        {
            if (vRole.Equals("Administrator"))
            {
                ListItem a = new ListItem("Administradores", "Administrator");
                ddlSearch.Items.Add(a);
                ListItem t = new ListItem("Docentes", "Teacher");
                ddlSearch.Items.Add(t);
            }
            ListItem s = new ListItem("Estudiantes", "Student");
            ddlSearch.Items.Add(s);
        }

        protected void UploadButton_Click(object sender, EventArgs e)
        {
            if (FileUploadControl.PostedFile != null)
            {
                Boolean ok = false;
                String fileExtension =
                        System.IO.Path.GetExtension(FileUploadControl.FileName).ToLower();
                String[] allowedExtensions = { ".png", ".jpeg", ".jpg" };
                for (int i = 0; i < allowedExtensions.Length; i++)
                {
                    if (fileExtension == allowedExtensions[i])
                    {
                        ok = true;
                    }
                }
                if (ok)
                {
                    try
                    {
                        //Se crea un nombre aleatorio para el archivo cargado y se le asigna la extension de archivo
                        //que tenia el nombre original.
                        Session["photoFile"] = Path.GetRandomFileName();
                        Session["photoFile"] = Path.ChangeExtension(Session["photoFile"].ToString(), ".bmp");
                        //Se crea una instancia de Bitmap con el contenido de FileUpload.
                        Bitmap originalBitMap = new Bitmap(FileUploadControl.FileContent);
                        //Se pasa el bitmap como parametro a la funcion scaleImage, junto con el tamaño deseado.
                        Bitmap newBitMap = scaleImage(originalBitMap, 350, 262);
                        newBitMap.Save(Server.MapPath("../Data/" + Session["photoFile"].ToString()));
                        this.imgDemo.ImageUrl = "../Data/" + Session["photoFile"].ToString();
                        statusLabel.Text = "Archivo cargado!";
                    }
                    catch (Exception ex)
                    {
                        statusLabel.Text = "El archivo no pudo ser cargado.";
                    }
                }
                else
                {
                    statusLabel.Text = "El archivo no es del tipo correcto, verifique que sea del tipo .png, .jpg o .jpeg.";
                }
            }
        }

        //Este metodo fue sacado de:
        //http://www.microtuts.com/c-resize-an-image-proportionally-specify-max-widthheight/
        //Recibe una imagen, un ancho maximo y una altura maxima y devuelve un bitmap
        //con las medidas especificadas manteniendo la proporcion de las medidas originales.

        private Bitmap scaleImage(System.Drawing.Image image, int maxWidth, int maxHeight)
        {
            var ratioX = (double)maxWidth / image.Width;
            var ratioY = (double)maxHeight / image.Height;
            var ratio = Math.Min(ratioX, ratioY);

            var newWidth = (int)(image.Width * ratio);
            var newHeight = (int)(image.Height * ratio);

            var newImage = new Bitmap(newWidth, newHeight);
            Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
            Bitmap bmp = new Bitmap(newImage);

            return bmp;
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            if (!ddlUserType.SelectedValue.ToString().Equals("none") && !Session["photoFile"].ToString().Equals(""))
            {

                if (ddlUserType.SelectedValue.ToString().Equals("Administrator"))
                {

                    Administrator a = new Administrator();
                    a = (Administrator)getPersonFromForm(a);
                    //Se le agrega el id de la persona...
                    a.LngId = long.Parse(lblNroId.Text);
                    //Se guardan los cambios del Administrador
                    AdministratorBL.updateAdministrator(a);
                }
                else if (ddlUserType.SelectedValue.ToString().Equals("Teacher"))
                {
                    Teacher t = new Teacher();
                    t = (Teacher)getPersonFromForm(t);
                    //Se le agrega el id de la persona...
                    t.LngId = long.Parse(lblNroId.Text);
                    //Se guardan los cambios del docente.
                    TeacherBL.updateTeacher(t);
                }
            }
            else
            {
                lblInfo.Text = "Asegurese de haber seleccionado el tipo de usuario a crear y cargado la foto";
            }
        }

        private void loadDdlDocType()
        {
            ddlDocType.Items.Clear(); // Borra el contenido de la lista de tipos de documento disponibles.
            ListItem unL = new ListItem("Otro", "" + 0);
            ddlDocType.Items.Add(unL);

            //Recibe la lista de tecnicos disponibles.
            DataTable dt = DocTypeBL.getDocTypeList();
            foreach (DataRow row in dt.Rows)
            {
                ListItem e = new ListItem(row[1].ToString(), row[0].ToString());
                ddlDocType.Items.Add(e);
            }
            ddlDocType.SelectedIndex = 1;
        }

        

        protected void ddlDocType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlDocType.SelectedValue.Equals("0"))
            {
                mvSelDocType.ActiveViewIndex = 0;
            }
            else
            {
                mvSelDocType.ActiveViewIndex = -1;
            }
        }

        protected void ddlMain_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlMain.SelectedValue.Equals("New"))
            {
                mvMain.ActiveViewIndex = 0;
                mvUserType.ActiveViewIndex = 0;
                mvButtons.ActiveViewIndex = 1;
                //mvConfirmPass.ActiveViewIndex = -1;
            }
            else if (ddlMain.SelectedValue.Equals("AddModify"))
            {
                mvMain.ActiveViewIndex = 0;
                mvUserType.ActiveViewIndex = -1;
                mvButtons.ActiveViewIndex = 0;
                //mvConfirmPass.ActiveViewIndex = 0;
                mvSearch.ActiveViewIndex = 0;
                //Carga el dropdownlist de busqueda de usuarios y alumnos con los tipos de usuarios disponibles para dicha busqueda.
                loadDdlSearch(Session["userRole"].ToString());
            }
            else
            {
                mvMain.ActiveViewIndex = -1;
                mvUserType.ActiveViewIndex = -1;
                mvUserPass.ActiveViewIndex = -1;
            }
        }

        protected void btnNew_Click(object sender, EventArgs e)
        {
            if (!ddlUserType.SelectedValue.ToString().Equals("none") && !Session["photoFile"].ToString().Equals(""))
            {

                if (ddlUserType.SelectedValue.ToString().Equals("Administrator") && validateUserAndPass())
                {

                    Administrator a = new Administrator();
                    a = (Administrator)getPersonFromForm(a);
                    //Se guarda el nuevo Administrador
                    AdministratorBL.addAdministrator(a);
                }
                else if (ddlUserType.SelectedValue.ToString().Equals("Teacher") && validateUserAndPass())
                {
                    Teacher t = new Teacher();
                    t = (Teacher)getPersonFromForm(t);
                    //Se guarda el nuevo docente.
                    TeacherBL.addTeacher(t);
                }

            }
            else
            {
                lblInfo.Text = "Asegurese de haber seleccionado el tipo de usuario a crear y cargado la foto";
            }
        }

        //Devuelve una instancia de person con los datos del formulario asignados a sus propiedades.
        private Person getPersonFromForm(Person p)
        {
            p.StrFstName = txtFstName.Text;
            p.StrSecName = txtSecName.Text != "" ? txtSecName.Text : null;
            p.StrFstSurname = txtFstSurname.Text;
            p.StrSecSurname = txtSecSurname.Text != "" ? txtSecSurname.Text : null;
            p.StrEmail = txtMail.Text;
            p.StrCellphone = txtCell.Text;
            p.StrTelephone = txtTel.Text;
            p.StrAddress = txtAddress.Text;
            //Si el tipo de documento que se ingresa no esta en la lista..
            if (ddlDocType.SelectedValue.Equals("0"))
            {
                //Se agrega un registro a la base de datos con el nuevo tipo de documento, se obtiene el id de 
                //dicho registro y luego se obtiene el objeto DocType correspondiente para agregarlo a la 
                //instancia de persona.
                p.DtDocType = DocTypeBL.getDocTypeById(DocTypeBL.addDocType(txtOtherDocType.Text));
            }
            else
            {//Si el tipo de documento que se ingresa esta en la lista...
                //Se consigue el objeto doctype correspondiente al valor seleccionado en ddldoctype y se le asigna 
                //a la instancia de persona.
                p.DtDocType = DocTypeBL.getDocTypeById(long.Parse(ddlDocType.SelectedValue));
            }
            p.StrDocument = txtDoc.Text;
            p.StrPhotoPath = Session["photoFile"].ToString();
            p.StrComments = txtComments.Text;

            //Si el tipo del objeto dentro de la clase persona es Administrador...
            if (p.GetType().ToString().Equals("DTO.Administrator"))
            {
                Administrator a = (Administrator)p;
                a.StrUserName = txtUsername.Text;
                a.StrPassword = txtPass.Text;
                p = a;
            }
            else if(p.GetType().ToString().Equals("DTO.Teacher"))
            {//Si el tipo del objeto dentro de la clase persona es Teacher...
                Teacher t = (Teacher)p;
                t.StrUserName = txtUsername.Text;
                t.StrPassword = txtPass.Text;
                p = t;
            }

            return p;
        }
        private Boolean validateUserAndPass()
        {
            Boolean aux = false;
            if (!txtUsername.Text.Equals("") && txtUsername.Text.Length >= 6)
            {
                if (!txtPass.Text.Equals("") && txtPass.Text.Length >= 8)
                {
                    aux = true;
                }
                else
                {
                    lblErrPassNotWritten.Text = "No ha escrito un password valido, no debe ser menor de 8 caracteres";
                }
            }
            else
            {
                lblErrUserNotWritten.Text = "No ha escrito un nombre de usuario valido, no debe ser menor de 6 caracteres";
            }
            return aux;
        }

        protected void ddlUserType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlUserType.SelectedValue.ToString().Equals("Student"))
            {
                mvUserPass.ActiveViewIndex = -1;
            }
        }

        protected void btnSearch_Click(object sender, EventArgs e)
        {
            //Se limpia el formulario..
            cleanForm();
            DataTable dt;
            
            //Se obtiene una lista de resultados de la busqueda realizada y se le asigna al DataTable.
            if (!txtSearch.Text.Equals(""))
            { 
                if(ddlSearch.SelectedValue.Equals("Administrator"))
                {
                    dt = AdministratorBL.getAdminListBySearch(txtSearch.Text);
                }
                else if (ddlSearch.SelectedValue.Equals("Teacher"))
                {
                    dt = TeacherBL.getTeacherListBySearch(txtSearch.Text);
                }
                else
                {
                    dt = StudentBL.getStudentListBySearch(txtSearch.Text);
                }
                //Se carga el GridView con los resultados.
                gvPeople.DataSource = dt;
                gvPeople.DataBind();
            }
        }

        protected void gvPeople_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se limipia el formulario...
            cleanForm();
            if (ddlSearch.SelectedValue.Equals("Administrator"))
            {
                loadForm(AdministratorBL.getAdministratorById(long.Parse(gvPeople.SelectedRow.Cells[0].Text)));
            }
            else if (ddlSearch.SelectedValue.Equals("Teacher"))
            {
                loadForm(TeacherBL.getTeacherById(long.Parse(gvPeople.SelectedRow.Cells[0].Text)));
            }
            else
            {
                loadForm(StudentBL.getStudentById(long.Parse(gvPeople.SelectedRow.Cells[0].Text)));
            }
        }

        //Carga los datos de un usuario o estudiante en el formulario.
        private void loadForm(Person p)
        {
            lblNroId.Text = p.LngId.ToString();
            txtFstName.Text = p.StrFstName.ToString();
            txtSecName.Text = p.StrSecName != null ? p.StrSecName.ToString():"";
            txtFstSurname.Text = p.StrFstSurname.ToString();
            txtSecSurname.Text = p.StrSecSurname != null ? p.StrSecSurname.ToString(): "";
            txtMail.Text = p.StrEmail.ToString();
            txtTel.Text = p.StrTelephone.ToString();
            txtCell.Text = p.StrCellphone.ToString();
            txtAddress.Text = p.StrAddress.ToString();
            //Se recarga el dropdownlist de tipo de documento...
            loadDdlDocType();
            ddlDocType.SelectedValue = p.DtDocType.LngId.ToString();
            txtDoc.Text = p.StrDocument.ToString();
            txtComments.Text = p.StrComments != null ? p.StrComments.ToString(): "";
            //se asigna el path de la foto a la variable de session 
            Session["photoFile"] = p.StrPhotoPath.ToString();
            //Se carga la foto...
            this.imgDemo.ImageUrl = "../Data/" + Session["photoFile"].ToString();
            
            //Si la instancia de persona recibida contiene un administrador o un docente...
            if (p.GetType().ToString().Equals("DTO.Administrator"))
            {
                ddlUserType.SelectedValue = "Administrator";
                Administrator a = (Administrator)p;
                txtUsername.Text = a.StrUserName.ToString();
                txtPass.Text = a.StrPassword.ToString();
            }
            else if(p.GetType().ToString().Equals("DTO.Teacher"))
            {
                ddlUserType.SelectedValue = "Teacher";
                Teacher t = (Teacher)p;
                txtUsername.Text = t.StrUserName.ToString();
                txtPass.Text = t.StrPassword.ToString();
            }
        }

        //Limpia el formulario.
        private void cleanForm()
        {
            this.imgDemo.ImageUrl = "";
            lblNroId.Text = "";
            txtFstName.Text = "";
            txtSecName.Text = "";
            txtFstSurname.Text = "";
            txtSecSurname.Text = "";
            txtMail.Text = "";
            txtTel.Text = "";
            txtCell.Text = "";
            txtAddress.Text = "";
            txtDoc.Text = "";
            txtComments.Text = "";
            txtUsername.Text = "";
            txtPass.Text = "";
            //txtConPass.Text = "";
            //txtOldPass.Text = "";

        }
    }
}